package main

import "fmt"

func main() {
	/*
	   切片声明和初始化的几种方法
	*/

	//1、var定义
	// var slice1 []int

	//2、make函数创建   make([]T,size,cap)
	var slice2 = make([]int, 5, 10) // [0 0 0 0 0]   参数1:类型  参数2:长度  参数3:容量
	fmt.Println(slice2)
	fmt.Printf("长度：%v,容量：%v\n", len(slice2), cap(slice2)) //长度：5,容量：10

	/* slice2[5] = 2    报错 无法使用下标给切片扩容
	fmt.Println(slice2) */

	//3、切片扩容 使用append追加扩容
	sl2ice2 := append(slice2, 1)
	fmt.Println(sl2ice2) //[0 0 0 0 0 1]

	//4、append方法合并切片
	sliceA := []string{"php", "java"}
	sliceB := []string{"nodejs", "js"}
	sliceA = append(sliceA, sliceB...)
	fmt.Println(sliceA) //[php java nodejs js]

	//5、切片扩容策略
	var sliceC []int
	for i := 1; i <= 10; i++ {
		sliceC = append(sliceC, i)
		fmt.Printf("长度：%v,容量：%v\n", len(sliceC), cap(sliceC))
		/*
					长度：1,容量：1
				    长度：2,容量：2
				    长度：3,容量：4
				    长度：4,容量：4
				    长度：5,容量：8
				    长度：6,容量：8
			    	长度：7,容量：8
				    长度：8,容量：8
			     	长度：9,容量：16
				    长度：10,容量：16
		*/
	}

	/*
	   6、值类型：改变变量富文本的值，不会改变变量本身的值
	    引用类型：改变变量赋文本的值，会改变变量本身的值
	*/
	sliceD := []int{1, 2, 3, 4}
	sliceE := sliceD
	sliceE[0] = 100
	fmt.Println("sliceD=", sliceD) //sliceD= [100 2 3 4]  改变sliceE 的值 sliceD也变了

	sliceF := []int{1, 2, 3, 4}
	sliceG := make([]int, 5, 5)
	copy(sliceG, sliceF) // 将F的值复制给D
	sliceF[1] = 999
	fmt.Println("sliceF=", sliceF, "sliceG=", sliceG) //sliceF= [1 999 3 4] sliceG= [1 2 3 4 0]

	//7、slice切片删除元素
	//append方法   删除索引为2的元素， 注意：append合并切片的时候最后一个元素需要...
	a := []int{1, 2, 3, 4, 5}
	a = append(a[:2], a[3:]...)
	fmt.Println(a) //[1 2 4 5]

	//8、字符串转换
	str1 := "hello golang"
	byteStr := []byte(str1)
	byteStr[0] = 'H'
	fmt.Println(string(byteStr)) //Hello golang

	str2 := "你好golang"
	runStr := []rune(str2)
	runStr[0] = '大'
	fmt.Println(string(runStr)) //大好golang

}
